package cz.pecinovsky.english.pojj.adv_demo.cesta_školou.hra;
/* Kodovani UTF-8: Příliš žluťoučký kůň úpěl ďábelské ódy. */

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IBagG;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;



/*******************************************************************************
 * Instance třídy {@code Batoh} představují úložiště, do nichž si hráči
 * odkládají sebrané předměty či jejch ekvivalenty.
 *
 * @author    Rudolf PECINOVSKÝ
 * @version   0.00.000
 */
public class Batoh implements IBagG
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    private static final int KAPACITA = 2;



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    private final Collection<Objekt> objekty = new ArrayList<Objekt>();



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří nový batoh, v němž bude hráč přenášet objekty.
     *
     * @param názvyObjektů Názvy objektů umístěných v batohu na počátku hry
     */
    public Batoh(String... názvyObjektů)
    {
        for (String o : názvyObjektů) {
            objekty.add(new Objekt(o));
        }
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí kapacitu batohu, tj. kolik objektů se do něj vejde.
     *
     * @return Kapacita batohu
     */
    @Override
    public int getCapacity()
    {
        return KAPACITA;
    }


    /***************************************************************************
     * Vrátí kolekci objektů uložených v batohu.
     *
     * @return Kolekce objektů v batohu
     */
    @Override
    public Collection<Objekt> getObjects()
    {
        return Collections.unmodifiableCollection(objekty);
    }



//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Přidá zadaný předmět do batohu.
     *
     * @param  předmět Předmět přidávaný do batohu
     * @return {@code true} pokud byl předmět do batohu vložen
     */

    boolean přidej(Objekt předmět) {
        boolean zvedám = (objekty.size() < KAPACITA)  &&  objekty.add(předmět);
        return zvedám;
    }


    /***************************************************************************
     * Vyjme z batohu předmět zadaný svým názvem.
     *
     * @param  název Název předmětu vybíraného z batohu
     * @return Byl-li předmět v batohu, vrátí odkaz na předmět,
     *         jinak vrátí prázdný odkaz {@code null}
     */
    Objekt vyjmi(String název) {
        Objekt našel = (Objekt)Utility.najdi(název, objekty);
        if (našel != null) {
            objekty.remove(našel);
        }
        return našel;
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        Batoh inst = new Batoh();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
